数据结构 AVL树

前言

大家都玩过球球大作战的游戏吧,他的原型是Agar.IO,在这款游戏了我们扮演一个小球,刚出生的我们除了速度快,视野生存能力都一般,为了追求某种平衡,通过不断的吞噬其他小球来让自己变大,变长,但是我们的速度却在下降.这个追逐平衡的过程呢,就是我们今天的主题,AVL树,AVL树也叫二叉平衡树,是一种二叉排序树,其中每一个节点的左子树和右子树高度差至多等于1.这样做的好处是,我们的查找会非常方便,而且也避免了二叉树变成斜树而带来的性能影响.

二叉平衡树的实现原理

在AVL树中,每当我们插入一个节点,就检查是否因为插入而破坏了树的平衡,如果破话了平衡,就找出最小不平衡树(距离插入节点最近的,平衡因子大于1的节点为根的子树),在保持AVL树特性的前提下,进行旋转操作,来达到平衡.那么破坏平衡的插入是哪4个呢?

插入节点左子树的左子树 LL

插入节点左子树的右子树 LR

插入节点右子树的左子树 RL

插入节点右子树的右子树 RR

那么对于这四种情况,我们分别要用到这些旋转操作,比如LL要用

	//LL旋转
	public static Node rotateWidthLeftChild(Node tree){
		Node root=tree.leftChild;
		tree.leftChild=root.rightChild;
		root.rightChild=tree;
		tree.height=Math.max(height(tree.leftChild), height(tree.rightChild))+1;
		root.height=Math.max(height(root.leftChild), tree.height)+1;
		return root;
	}

LR要用

//LR
	public static Node doubleWidthLeftChild(Node tree){
		tree.leftChild=rotateWidthRightChild(tree.leftChild);
		return rotateWidthLeftChild(tree);
	}


RR要用

//RR旋转
	public static Node rotateWidthRightChild(Node tree){
		Node root=tree.rightChild;
		tree.rightChild=root.leftChild;
		root.leftChild=tree;
		tree.height=Math.max(height(tree.leftChild), height(tree.rightChild))+1;
		root.height=Math.max(height(root.leftChild), tree.height)+1;
		return root;
	}

RL要用

	//RL
	public static Node doubleWidthRightChild(Node tree){
		tree.rightChild=rotateWidthLeftChild(tree.rightChild);
		return rotateWidthRightChild(tree);
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值